import storage from 'src/utils/storage';
import LoginAPI from './login';

const TokenKey = 'at';
const UserInfoKey = 'ui';

/**
 * 获取token字符串
 * @returns {*}
 */
function getAccessToken() {
    if (getToken()) {
        return getToken()['access_token'];
    } else {
        return null;
    }
}

/**
 * 获取整个token对象
 * @returns {*}
 */
function getToken() {
    return storage.get(TokenKey);
}

/**
 * 此处token为OAuth2格式的返回消息，包括超期时间
 * @param token  {object}
 * @param token.access_token {string} 实际token字符串
 * @param token.expires_in {number} 将在多少秒超期，存储时计算超期时间
 * @returns {*|void}
 */
function setToken(token) {
    let now = new Date().getTime();
    token['expires_at'] = now + token['expires_in'] * 1000;
    return storage.set(TokenKey, token);
}

function removeToken() {
    return storage.remove(TokenKey);
}

export function getUserInfo() {
    return storage.get(UserInfoKey);
}

function setUserInfo(info) {
    storage.set(UserInfoKey, info);
}

function removeUserInfo() {
    return storage.remove(UserInfoKey);
}

/**
 * 检查登陆状态，登陆时同时缓存了用户信息和token，
 * 二者同时存在才表明登陆有效，
 * 并且token必须在有效期内, 如果超期就抹掉token
 * 否则要求重新登陆
 */
function checkLogin() {
    // 有token但是超期
    if (getToken() && new Date().getTime() > getToken()['expires_at']) {
        removeToken();
        removeUserInfo();
    }
    return getToken() && getUserInfo();
}

/**
 * 判断是否有权限
 * @param roles
 * @param permissionRoles
 * @returns {*}
 */
function hasPermission(roles, permissionRoles) {
    if (roles.indexOf('admin') >= 0) return true; // admin permission passed directly
    if (!permissionRoles) return true;
    return roles.some(role => permissionRoles.indexOf(role) >= 0);
}

/**
 * 获取用户信息，成功后生成用户菜单和一些权限目录
 */
function requestUserInfo() {
    return new Promise((resolve, reject) => {
        LoginAPI.getUserInfo().then(data => {
            let user = data;
            user.roles = ['admin'];
            setUserInfo(user);
            resolve(user);
        }).catch(error => {
            reject(error);
        });
    });
}

/**
 * 用户登陆
 * 成功后获取用户信息
 */
function login(username, password) {
    return new Promise((resolve, reject) => {
        LoginAPI.login(username.trim(), password)
            .then(data => {
                setToken(data);
                // 获取用户信息，不再单独获取，和token同时存在，必须重新登陆才会刷新
                requestUserInfo().then(resolve).catch(reject);
            })
            .catch(reject);
    });
}

/**
 * 登出
 * 清除本地缓存，并向后台发送登出操作
 */
function logout() {
    removeToken();
    removeUserInfo();
}

/**
 * 快速获取id
 */
function getUserId() {
    return getUserInfo().id || '';
}

function getUserName() {
    return getUserInfo().username || '';
}

export default {
    getAccessToken,
    getToken,
    setToken,
    removeToken,
    getUserInfo,
    setUserInfo,
    removeUserInfo,
    checkLogin,
    hasPermission,
    login,
    logout,
    getUserId,
    getUserName
};
